package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.MenuDao;
import com.itheima.dao.RoleDao;
import com.itheima.entity.PageResult;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.Menu;
import com.itheima.pojo.Role;
import com.itheima.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.JedisPool;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author HHF
 * @date 2020/12/24 - 17:12
 * @describe 角色管理服务接口实现类
 */
@Service(interfaceClass = RoleService.class)
@Transactional
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    @Autowired
    private MenuDao menuDao;

    /**
     * 分页查询角色
     * @param currentPage
     * @param pageSize
     * @param queryString
     * @return
     */
    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
        //1、设置分页查询条件,当前页码、每页记录数
        PageHelper.startPage(currentPage,pageSize);

        //2、按条件查所有,返回响应分页插件的Page对象
        Page<Role> page = roleDao.selectByCondition(queryString);

        //3、Page<T>提取数据，返回新建PageResult对象
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 添加角色
     * @param permissions
     * @param menus
     * @param role
     * @return
     */
    @Override
    public void add(Integer[] permissions, Integer[] menus, Role role) {
        //添加角色记录，回显id
        roleDao.add(role);

        //批量添加角色权限中间表记录
        setRoleAndPermission(role.getId(),permissions);

        //批量添加角色菜单中间表记录
        setRoleAndMenu(role.getId(),menus);
    }

    /**
     * 批量添加角色菜单中间表记录
     * @param roleId
     * @param menus
     */
    private void setRoleAndMenu(Integer roleId, Integer[] menus) {
        if(menus != null && menus.length > 0){
            for (Integer menuId : menus) {
                Map<String,Integer> paramMap = new HashMap<String,Integer>();
                paramMap.put("menu_id",menuId);
                paramMap.put("role_id",roleId);
                roleDao.setRoleAndMenu(paramMap);
            }
        }
    }

    /**
     * 批量添加角色权限中间表记录
     * @param roleId
     * @param permissions
     */
    private void setRoleAndPermission(Integer roleId, Integer[] permissions) {
        if(permissions != null && permissions.length > 0){
            for (Integer permissionId : permissions) {
                Map<String,Integer> paramMap = new HashMap<String,Integer>();
                paramMap.put("permission_id",permissionId);
                paramMap.put("role_id",roleId);
                roleDao.setRoleAndPermission(paramMap);
            }
        }
    }

    /**
     * 根据id查询角色
     * @param roleId
     * @return
     */
    @Override
    public Role findById(Integer roleId) {
        return roleDao.findById(roleId);
    }

    /**
     * 根据角色id查询角色菜单中间表记录(二级菜单)
     * @param roleId
     * @return
     */
    @Override
    public Integer[] findMenusByRoleId(Integer roleId) {
        return roleDao.findMenusByRoleId(roleId);
    }

    /**
     * 根据角色id查询角色权限中间表记录
     * @param roleId
     * @return
     */
    @Override
    public Integer[] findPermissionsByRoleId(Integer roleId) {
        return roleDao.findPermissionsByRoleId(roleId);
    }

    /**
     * 编辑角色
     * @param permissions
     * @param menus
     * @param role
     * @return
     */
    @Override
    public void edit(Integer[] permissions, Integer[] menus, Role role) {
        //修改角色记录
        roleDao.edit(role);

        //清空角色菜单中间表记录
        roleDao.deleteRoleAndMenu(role.getId());

        //批量添加角色菜单中间表记录
        setRoleAndMenu(role.getId(),menus);

        //清空角色权限中间表记录
        roleDao.deleteRoleAndPermission(role.getId());

        //批量添加角色权限中间表记录
        setRoleAndPermission(role.getId(),permissions);
    }

    /**
     * 删除角色
     * @param roleId
     */
    @Override
    public void deleteById(Integer roleId) {
        //清空角色菜单中间表记录
        roleDao.deleteRoleAndMenu(roleId);

        //清空角色权限中间表记录
        roleDao.deleteRoleAndPermission(roleId);

        //删除角色
        roleDao.deleteById(roleId);
    }

    /**
     * 根据角色名查角色
     * @param roleName
     * @return
     */
    @Override
    public Role findByName(String roleName) {
        return roleDao.findByName(roleName);
    }

    /**
     * 根据角色关键字查角色
     * @param roleKeyWord
     * @return
     */
    @Override
    public Role findByKeyWord(String roleKeyWord) {
        return roleDao.findByKeyWord(roleKeyWord);
    }
}
